﻿/***********************************************************************************************//**
*\n  @file       netcan.h
*\n  @brief      can通讯驱动模块接口
*\n  @details
*\n -----------------------------------------------------------------------------------
*\n  文件说明：
*\n       1. can通讯驱动模块接口
*\n
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2021.4.7    创建
*\n  V0.02 罗先能        2021.7.7    添加读写锁等
*\n
***************************************************************************************************/
#ifndef CAN_B70D0570_7C8E_420A_8F22_94C2004A8919
#define CAN_B70D0570_7C8E_420A_8F22_94C2004A8919

#ifdef  __cplusplus
extern "C" {
#endif

/**************************************************************************************************
* 头文件
***************************************************************************************************/
#include <stdint.h>


/**************************************************************************************************
* 宏定义、结构定义
***************************************************************************************************/
#define CAN_EXTEND_FLAG  0x80000000U      ///< can扩展帧标志
#define CAN_EXTEND_MASK  0x1FFFFFFFU      ///< can报文id的mask（29bit有效)

/// can参数滤波器
struct canmsg_filter {
	uint32_t can_id;          ///< can报文id
	uint32_t can_mask;        ///< can报文id的MASK
};

/// can句柄
struct can_handle {
	int socket;               ///< can socket接口
	char dev_name[32];        ///< can名称
	pthread_rwlock_t lock;    ///< 读写锁
};



/**************************************************************************************************
* 全局变量声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 私有变量声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 私有函数声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 全局函数声明、定义
***************************************************************************************************/

/*************************************************************************************//**
*\n 函数名称： netcan_open()
*\n 功能描述：
*\n            open CAN接口
*\n 输入参数：
*\n            const char *dev  : 	设备名字符串,"can0" or "can1"
*\n            int bitrate		: 	波特率， 单位为Bps
*\n            int filter_num   : 	滤波表项个数(0~64)
*\n            struct canmsg_filter *filter_tab :  滤波表(可以为NULL)
*\n 输出参数:
*\n            can_handle *handle :  句柄指针
*\n
*\n 返 回 值:
*\n           0成功;  -1 失败
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2021.4.7     创建
*\n  V0.02 罗先能        2021.7.7     添加 can_handle *handle 参数
*****************************************************************************************/
int netcan_open(const char *dev, int bitrate,
				int filter_num, struct canmsg_filter *filter_tab,
				/*out*/ struct can_handle *handle);

/*************************************************************************************//**
*\n 函数名称： netcan_close()
*\n 功能描述：
*\n            关闭can接口
*\n 输入参数：
*\n            struct can_handle *handle : can句柄
*\n 输出参数:
*\n
*\n 返 回 值:
*\n           0 成功; -1 失败; -n     错误码
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2021.4.7     创建
*****************************************************************************************/
int netcan_close(struct can_handle *handle);


/*************************************************************************************//**
*\n 函数名称： netcan_write()
*\n 功能描述：
*\n            发送can报文
*\n 输入参数：
*\n            struct can_handle *handle : can句柄
*\n            unsigned int id			 : can id (扩展帧 + CAN_EXTEND_FLAG)
*\n            unsigned char *data       : 发送数据buffer
*\n            unsigned int bytes        : 数据个数byte单位, (1 ~ 8)bytes
*\n 输出参数:
*\n
*\n 返 回 值:
*\n           bytes 成功; -1 失败;
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2021.4.7     创建
*****************************************************************************************/
int netcan_write(struct can_handle *handle, unsigned int id, unsigned char *data,unsigned int bytes);

/*************************************************************************************//**
*\n 函数名称： netcan_read()
*\n 功能描述：
*\n            读取can报文
*\n 输入参数：
*\n            struct can_handle *handle : can句柄
*\n
*\n 输出参数:
*\n            unsigned int *id			 : can id (扩展帧 + CAN_EXTEND_FLAG)
*\n            unsigned char *data       : 数据buffer
*\n            unsigned char *bytes       : 数据个数 （可以为NULL）
*\n
*\n 返 回 值:
*\n           数据个数; -1 失败; -n 错误码
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01  罗先能        2021.4.8        创建
*****************************************************************************************/
int netcan_read(struct can_handle *handle, unsigned int* id, unsigned char *data,unsigned char* bytes);

#ifdef  __cplusplus
}
#endif

#endif
